import os
import json
import traceback
from extensions import redis_store
from services.constants import PLATFORM_CONFIG, REDIS_PREFIX

# 文件存储配置
STORAGE_FILE = os.path.join(os.path.dirname(os.path.dirname(__file__)), '.data', 'platform_data.json')
# 确保存储目录存在
os.makedirs(os.path.dirname(STORAGE_FILE), exist_ok=True)

# 如果文件不存在，则创建文件并设置默认内容
if not os.path.exists(STORAGE_FILE):
    with open(STORAGE_FILE, 'w', encoding='utf-8') as file:
        json.dump({}, file, )

def _get_data_from_file() -> dict:
    """从文件中读取数据"""
    with open(STORAGE_FILE, 'r', encoding='utf-8') as file:
        data = json.load(file)
        return data

def _save_data_to_file(data: dict) -> None:
    """保存数据到文件

    Parameters:
        data: 要保存的数据字典
    
    """
    with open(STORAGE_FILE, 'w', encoding='utf-8') as file:
        # indent=4 表示文件缩进4个空格，ensure_ascii=False表示不转义非ASCII字符
        json.dump(data, file, ensure_ascii=False, indent=4)

def _set_redis_crawl_at(platform: str, crawl_at: int) -> None:
    """设置 Redis 中的最新抓取时间

    Parameters:
      platform: 平台标识 例如 sspai(少数派)、weibo(微博)、zhihu(知乎)等
      crawl_at: 最新抓取时间
    """
    platform_info = PLATFORM_CONFIG.get(platform)
    platform_id = platform_info["id"]
    if redis_store.redis_client:
        redis_client = redis_store.redis_client
        key = f"{REDIS_PREFIX}:{platform_id}"
        redis_client.set(key, crawl_at)

def get_platform_latest_crawl_at(platform: str) -> int:
    """获取平台的最新抓取时间

    Parameters:
      platform: 平台标识 例如 sspai(少数派)、weibo(微博)、zhihu(知乎)等

    Returns:
      最新抓取时间
    """
    try:
        platform_info = PLATFORM_CONFIG.get(platform)
        if not platform_info:
            raise ValueError(f"平台 {platform} 不存在")
        platform_id = platform_info["id"]

        # 从 Redis 中获取最新抓取时间
        if redis_store.redis_client:
            redis_client = redis_store.redis_client
            key = f"{REDIS_PREFIX}:{platform_id}"
            latest_crawl_at = redis_client.get(key)
            if latest_crawl_at:
                return int(latest_crawl_at)
        
        # 如果 Redis 中没有数据，则从文件中读取
        data = _get_data_from_file()
        latest_crawl_at = data.get(platform_id, {}).get("last_crawl_at", 0)

        # 设置 Redis 中的最新抓取时间
        _set_redis_crawl_at(platform, latest_crawl_at)
        return latest_crawl_at

    except Exception as e:
        print(f"获取平台 {platform} 最新抓取时间失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e

def set_platform_latest_crawl_at(platform: str, crawl_at: int) -> None:
    """设置平台的最新抓取时间

    Parameters:
      platform: 平台标识 例如 sspai(少数派)、weibo(微博)、zhihu(知乎)等
      crawl_at: 最新抓取时间
    """
    try:
        platform_info = PLATFORM_CONFIG.get(platform)
        if not platform_info:
            raise ValueError(f"平台 {platform} 不存在")
        platform_id = platform_info["id"]

        # 更新 Redis 中的最新抓取时间
        _set_redis_crawl_at(platform, crawl_at)

        # 更新文件中的最新抓取时间
        data = _get_data_from_file()
        if platform_id not in data:
            data[platform_id] = {}
        data[platform_id]["last_crawl_at"] = crawl_at
        _save_data_to_file(data)

    except Exception as e:
        print(f"设置平台 {platform} 最新抓取时间失败:", e)
        print("详细错误信息:")
        traceback.print_exc()
        raise e